package com.naiterui.ehp.bs.doctor.service;

import com.naiterui.ehp.bp.bo.doctor.LoginParamBO;
import com.naiterui.ehp.bp.domain.Doctor;
import com.naiterui.ehp.bp.domain.Login;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.doctor.vo.DeviceVO;
import com.naiterui.ehp.bs.doctor.vo.DeviceVerifyVO;
import com.naiterui.ehp.bs.doctor.vo.LoginVO;

import javax.servlet.http.HttpServletRequest;

public interface ILoginService {

    boolean findCountByPhoneNum(String phoneNum);

    Login findLoginByPhoneNum(String phoneNum);

    void updateLogin(Login login);

    /**
     * 更新登录信息
     * ILoginService.updateDeviceSN()
     *
     * @param deviceSN
     * @param doctorId
     * @param loginAddr
     * @param origin    TODO
     *
     * @return
     *
     * @throws BusinessException
     * @Author guoyongxiang
     * @Date 2016年1月11日
     * @since 1.0.0
     */
    DeviceVO updateDeviceSN(String platform, String version, String model, String deviceSN, Long doctorId, String loginAddr, String origin)
            throws BusinessException;

    /**
     * 获取校验信息
     * LoginServiceImpl.getVerifyInfo()
     *
     * @param doctorId
     * @param deviceSN
     *
     * @return
     *
     * @Author guoyongxiang
     * @Date 2016年1月11日
     * @since 1.0.0
     */
    DeviceVerifyVO getVerifyInfo(Long doctorId, String deviceSN) throws BusinessException;

    Login findLoginById(Long loginId);

    void saveInitDoctor(Long doctorId);

    void savePassword(Long doctorId, Login login, String pwd) throws BusinessException;

    /**
     * 根据医生loginId和密码进行登录验证，并返回登录信息
     * ILoginService.saveLoginInfoById()
     *
     * @param loginId  登录id
     * @param loginKey 登录key
     * @param password 密码
     * @param deviceSN 设备编码
     * @param request  请求对象
     *
     * @return
     *
     * @throws BusinessException
     * @Author chenlin
     * @Date 2016年3月28日
     * @since 1.0.0
     */
    LoginVO saveLoginInfoById(Long loginId, String loginKey, String password, String version, String platform, String deviceSN,
                              HttpServletRequest request) throws BusinessException;

    /**
     * 短信验证登录。如果手机已经注册，则返回登录信息。如果手机号未注册，则提示注册。
     * ILoginService.saveLoginInfoByPhone()
     *
     * @param phoneNum
     * @param deviceSN
     * @param request
     *
     * @return
     *
     * @throws BusinessException
     * @Author chenlin
     * @Date 2016年3月28日
     * @since 1.0.0
     */
    LoginVO saveLoginInfoByPhone(String phoneNum, String version, String platform, String deviceSN, HttpServletRequest request)
            throws BusinessException;

    /**
     * 账号密码 + 验证码 判断医生是否注册，注册直接登录，未注册进行注册。
     * @param loginId
     * @param loginKey
     * @param password
     * @param phoneNum
     * @param v
     * @param p
     * @param deviceSN
     * @param request
     * @return
     */
    LoginVO saveLoginInfoConbine(Long loginId, String loginKey, String password, String phoneNum, String v, String p,
        String deviceSN, HttpServletRequest request) throws BusinessException;


    /**
     * 计算验证错误次数并判断redisKey对应的错误验证码验证次数是否在规定时间内超过规定值，如果超过验证次数，则返回true,否则返回false.
     *
     * @param cacheKey
     *
     * @return
     */
    boolean validUserOperator(String cacheKey);

    /**
     * 判断redisKey对应的错误验证码验证次数是否在规定时间内超过规定值，如果超过验证次数，则返回true,否则返回false.
     *
     * @param cacheKey
     *
     * @return
     */
    boolean validUserOperatorFlag(String cacheKey);

    /**
     * 异步初始化注册信息
     *
     * @param doctorId
     * @param phoneNum
     */
    void initRegist(Long doctorId, String phoneNum);

    /**
     * 保存注册信息
     *
     * @param loginParamBO
     *
     * @return
     *
     * @throws BusinessException
     */
    Long saveLogin(LoginParamBO loginParamBO) throws BusinessException;

    /**
     * 给医生添加默认标签
     * ILoginService.addDoctorLabel()
     *
     * @param login
     * @param doctorId
     *
     * @throws BusinessException
     * @Author gongbaoqiang
     * @Date 2018年8月8日
     * @since 3.1.0
     */
    void addDoctorLabel(LoginParamBO login, Long doctorId);

    /**
     * 初始化注册医生用户账户
     *
     * @param phone
     * @param name
     * @param pwd
     *
     * @return
     *
     * @throws BusinessException
     */
    Long addUser(String phone, String name, String pwd) throws BusinessException;

    void saveLogoutLog(Login login, Doctor doctor);

    void saveLoginLog(Login login, Doctor doctor);

    /**
     * 根据医生loginId快捷登录验证，并返回登录信息
     *
     * @param loginId  登录id
     * @param loginKey 登录key
     * @param fastLoginToken 快捷登录token
     * @param deviceSN 设备编码
     * @param request  请求对象
     *
     * @return
     *
     * @throws BusinessException
     * @Author chenlin
     * @Date 2016年3月28日
     * @since 1.0.0
     */
    LoginVO fastLoginInfoById(Long loginId, String loginKey, String fastLoginToken, String version, String platform, String deviceSN,
                              HttpServletRequest request) throws BusinessException;

    /**
     * 保存经纪人和医生关系
     * @param doctorId
     * @param params ['经纪人ID', '大区ID', '省区ID']
     */
    void saveAgentRelation(Long doctorId, String[] params);

}
